/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.lista05;

import java.util.Hashtable;
import java.util.Scanner;

/**
 *
 * @author mendel
 */
public class AgendaHash implements Repositorio
{
    Scanner s = new Scanner(System.in);
    Hashtable<String, Tarefa> tarefas = new Hashtable<String, Tarefa>();
    
    @Override
    public boolean cadastrarTarefa(int opcaoTipoTarefa, int opcaoTarefa) throws ImportanciaException
    {
        if (opcaoTipoTarefa == 1 || opcaoTipoTarefa == 2) 
        {
            if (opcaoTarefa == 1) 
            {
                int wCodigo = s.nextInt();
                String wDescricao = s.next();
                String wData = s.next();
                int wDuracao = s.nextInt();
                String wLocal = s.next();
                if(opcaoTipoTarefa == 1)
                {
                    tarefas.put(String.valueOf(wCodigo), new TarefaGerencial(wCodigo, wDescricao, wData, wDuracao, wLocal));
                    return true;
                }
                else
                {
                    tarefas.put(String.valueOf(wCodigo), new TarefaDesenvolvimento(wCodigo, wDescricao, wData, wDuracao, wLocal));
                    return true;
                }  
            }
            else if (opcaoTarefa == 2) 
            {
                int wCodigo = s.nextInt();
                String wDescricao = s.next();
                String wData = s.next();
                int wDuracao = s.nextInt();
                String wLocal = s.next();
                int wImportancia = 0;
                while (true) 
                {
                    wImportancia = s.nextInt();
                    if (wImportancia < 1 || wImportancia > 5) 
                    {
                        throw new ImportanciaException();
                    } 
                    else 
                    {
                        break;
                    }
                }
                int wUrgencia = 0;
                while (true) 
                {
                    wUrgencia = s.nextInt();
                    if (wUrgencia < 1 || wUrgencia > 5) 
                    {
                        throw new ImportanciaException();
                    } 
                    else 
                    {
                        break;
                    }
                }
                double wValorHora = s.nextDouble();
                if(opcaoTipoTarefa == 1)
                {
                    tarefas.put(String.valueOf(wCodigo), new TarefaGerencial(wCodigo, wDescricao, wData, wDuracao, wLocal, wImportancia, wUrgencia, wValorHora));
                    return true;
                }
                else
                {
                    tarefas.put(String.valueOf(wCodigo), new TarefaDesenvolvimento(wCodigo, wDescricao, wData, wDuracao, wLocal, wImportancia, wUrgencia, wValorHora));
                    return true;
                } 
            }
            return false;
        }
        else
        {
            if (opcaoTarefa == 1) 
            {
                String wDescricao = s.next();
                String wData = s.next();
                int wDuracao = s.nextInt();
                String wLocal = s.next();
                tarefas.put(String.valueOf(TarefaDesenvolvimentoAuto.codigo), new TarefaDesenvolvimentoAuto(wDescricao, wData, wDuracao, wLocal));
                return true;
            }
            else if (opcaoTarefa == 2) 
            {
                String wDescricao = s.next();
                String wData = s.next();
                int wDuracao = s.nextInt();
                String wLocal = s.next();
                int wImportancia = 0;
                while (true) 
                {
                    wImportancia = s.nextInt();
                    if (wImportancia < 1 || wImportancia > 5) 
                    {
                        throw new ImportanciaException();
                    } 
                    else
                    {
                        break;
                    }
                }
                int wUrgencia = 0;
                while (true) 
                {
                    wUrgencia = s.nextInt();
                    if (wUrgencia < 1 || wUrgencia > 5) 
                    {
                        throw new ImportanciaException();
                    } 
                    else 
                    {
                        break;
                    }
                }
                double wValorHora = s.nextDouble();
                tarefas.put(String.valueOf(TarefaDesenvolvimentoAuto.codigo), new TarefaDesenvolvimentoAuto(wDescricao, wData, wDuracao, wLocal, wImportancia, wUrgencia, wValorHora));
                return true;
            }
            return false;
        }
    }
    @Override
    public boolean removerTarefa(int codTarefa) throws SemTarefaException
    {
        if(tarefas.isEmpty())
        {
            throw new SemTarefaException();
        }
        else
        {
            if (tarefas.containsKey(String.valueOf(codTarefa))) 
            {
                tarefas.remove(String.valueOf(codTarefa));
                return true;
            } 
            else
            {
                return false;
            } 
        }
    }
    @Override
    public TarefaTO consultarTarefa(int codTarefa) throws SemTarefaException
    {
        TarefaTO tarefaAux = null;
        if(tarefas.isEmpty())
        {
            throw new SemTarefaException();
        }
        else
        {
            if (tarefas.containsKey(String.valueOf(codTarefa))) 
            {
                tarefaAux = new TarefaTO(tarefas.get(String.valueOf(codTarefa)).getCodigo(),
                            tarefas.get(String.valueOf(codTarefa)).getDescricao(),
                            tarefas.get(String.valueOf(codTarefa)).getData(),
                            tarefas.get(String.valueOf(codTarefa)).getDuracao(),
                            tarefas.get(String.valueOf(codTarefa)).getLocal(),
                            tarefas.get(String.valueOf(codTarefa)).getImportancia(),
                            tarefas.get(String.valueOf(codTarefa)).getUrgencia(),
                            tarefas.get(String.valueOf(codTarefa)).getValorHora());
                tarefaAux.setValorCobrado(tarefas.get(String.valueOf(codTarefa)).getValorCobrado());
                tarefaAux.setStatus(tarefas.get(String.valueOf(codTarefa)).getStatus());
                return tarefaAux;                
            } 
            else 
            {
                return tarefaAux;
            }  
        }
    }
    @Override
    public TarefaTO[] listarTarefa()
    {
        TarefaTO[] arrayAux = null;
        if(tarefas.isEmpty())
        {
            return arrayAux;
        }
        else
        {
            arrayAux = new TarefaTO[tarefas.size()];
            int i = 0;
            for(String a : tarefas.keySet())
            {
                arrayAux[i] = new TarefaTO(tarefas.get(a).getCodigo(), tarefas.get(a).getDescricao(),
                                           tarefas.get(a).getData(), tarefas.get(a).getDuracao(),
                                           tarefas.get(a).getLocal());
                i++;
            }
            return arrayAux;
        } 
    }
    @Override
    public boolean iniciarTarefa(int codigo) throws SemTarefaException
    {
        if(tarefas.isEmpty())
        {
            throw new SemTarefaException();
        }
        else
        {
            if (tarefas.containsKey(String.valueOf(codigo)))
            {
                tarefas.get(String.valueOf(codigo)).iniciarTarefa();
                return true;
            }
            else
            {
                return false;
            } 
        }
    }
    @Override
    public boolean encerrarTarefa(int codigo, double wValorCobrado) throws SemTarefaException
    {
        if(tarefas.isEmpty())
        {
            throw new SemTarefaException();
        }
        else
        {
            if (tarefas.containsKey(String.valueOf(codigo))) 
            {
                tarefas.get(String.valueOf(codigo)).encerrarTarefa(wValorCobrado);
                return true;
            } 
            else
            {
                return false;
            } 
        }
    }
    @Override
    public boolean alterarImportancia(int codigo, int wOpcao) throws SemTarefaException
    {
        if(tarefas.isEmpty())
        {
            throw new SemTarefaException();
        }
        else
        {
            if (tarefas.containsKey(String.valueOf(codigo)))
            {
                if (wOpcao == 1) 
                {
                    tarefas.get(String.valueOf(codigo)).incrementaImportancia();
                    return true;
                } 
                else if (wOpcao == 2)
                {
                    tarefas.get(String.valueOf(codigo)).decrementaImportancia();
                    return true;
                }
            } 
            return false;
        }
    }
    @Override
    public boolean cancelarTarefa(int codigo) throws SemTarefaException
    {
        if(tarefas.isEmpty())
        {
            throw new SemTarefaException();
        }
        else
        {
            if (tarefas.containsKey(String.valueOf(codigo)))
            {
                tarefas.get(String.valueOf(codigo)).cancelarTarefa();
                return true;
            }
            return false;
        }
    }
    public boolean reiniciarTarefa(int codigo) throws SemTarefaException, SemMetodoException
    {
        TarefaDesenvolvimento tarefaDesenv;
        if(tarefas.isEmpty())
        {
            throw new SemTarefaException();
        }
        else
        {
            if (tarefas.containsKey(String.valueOf(codigo)))
            {
                if(tarefas.get(String.valueOf(codigo)) instanceof TarefaDesenvolvimento)
                {
                    tarefaDesenv = (TarefaDesenvolvimento)tarefas.get(String.valueOf(codigo));
                    tarefaDesenv.reiniciarTarefa();
                    return true;
                }
                else
                {
                    throw new SemMetodoException();
                }
            }
            else
            {
                return false;
            }
        }
    }
}
